package com.fyb.basic.juc.completableFuture;

import java.util.concurrent.CompletableFuture;

/**
 * @Author：MR.FANG
 * @name：SupplyAsync
 * 演示CompletableFuture的supplyAsync()
 * 流程：小白点菜  厨师炒菜 小白吃饭
 * @Date：2025/7/2 下午2:02
 */
public class SupplyAsync {

  public static void main(String[] args) {
      // 1、小王进入餐厅的逻辑
      SmallTool.printTimeAndTread("小王进入餐厅");
      SmallTool.printTimeAndTread("小王点了一份西红柿炒蛋，又点了一份米饭");

      // 2、小白点完菜后 厨师炒菜逻辑
      // Supplier 函数式接口 没有入参 有一个返回值 也就是对外提供数据使用
      CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
          // 厨师炒菜逻辑 单独线程处理
          SmallTool.printTimeAndTread("厨师炒菜");
          SmallTool.sleepMillis(200);
          SmallTool.printTimeAndTread("厨师打饭");
          SmallTool.sleepMillis(100);
          return "厨师的番茄炒蛋和米饭做好了";
      });

      // 3、小白做其他的事情
      SmallTool.printTimeAndTread("小王正在打游戏");
      // 4、 join 方法用来completableFuture执行返回的结果
      // join 也会抛出异常 运行时异常  不用通过catch 进行捕获
      // join 方法的返回值类型就是CompletableFuture 的泛型
      // join 就是futureTask中get方法的升级版本 会等任务执行结果 然后返回任务的执行结果
      SmallTool.printTimeAndTread(String.format("%s,小王开吃", completableFuture.join()));
  }
}
